TOP

Pesquisa difusa_ para LibreOffice Calc

FUZZYLOOKUP() Descrição

Todos nós conhecemos a conhecida função VLOOKUP() que nos ajuda a combinar dados de diferentes tabelas. Porém, esta função tem uma desvantagem significativa - ela não pode combinar valores semelhantes, ou seja, se houver um erro na palavra, não haverá correspondência.

Para poder combinar valores aproximados, podemos criar nossa própria função. Vamos chamá-lo de FuzzyLookup().

Vamos imaginar que temos duas listas. Ambos têm aproximadamente os mesmos elementos, mas podem ser escritos de maneira um pouco diferente. A tarefa é encontrar para cada elemento da primeira lista o elemento mais semelhante da segunda lista, ou seja, implementar uma busca pelo texto maximamente semelhante mais próximo.

A grande questão, neste caso, é o que considerar como critério de “semelhança”. Apenas o número de caracteres correspondentes? É o número de partidas consecutivas? Devem ser considerados caracteres maiúsculas ou espaços? O que fazer com diferentes arranjos de palavras em uma frase? As opções são muitas e não existe uma solução única - para cada situação uma ou outra será melhor que outras.

No nosso caso, implementamos a opção mais simples - pesquisar pelo número máximo de correspondências de caracteres. Não é perfeito, mas funciona muito bem na maioria das situações.


Código StarBASIC para a função FuzzyLookup

Adicionar função FuzzyLookup , abra o menu Tools - Macros - Edit Macros... , selecione Módulo1 e copie o seguinte texto no módulo:


Function FuzzyLOOKUP(LookupValue As String, SrcTable As Variant, Optional SimThreshold As Single) As String 
  ' moonexcel.com.ua 
  Dim Str       As String  
  Dim CellArray As Variant
  Dim StrArray  As Variant
  
  If IsMissing(SimThreshold) Then SimThreshold  = 0
  
  Str      = LCase(LookupValue)
  StrArray = Split(Str)
  StrExt   = UBound(StrArray)  
            
  For Each Cell In SrcTable
                          
    CellArray = Split(LCase(Cell))
    CellExt   = UBound(CellArray)    	    
    CellRate  = 0
	
    ' Verificamos cada palavra na frase de pesquisa 
    For x = 0 To StrExt 
    
      StrWord = StrArray(x)	  
      If Len(StrWord) = 0 Then GoTo continue_x
	  MaxStrWordRate = 0
	  
      ' Verificamos cada palavra na próxima célula da tabela de valores original 
      For i = 0 To CellExt
        
        CellWord = CellArray(i)
		If Len(CellWord) = 0 Then GoTo continue_i
   
        FindCharNum = OccurrenceNum(StrWord, CellWord)
        StrWordRate = FindCharNum / Max(Len(StrWord),Len(CellWord))
		
        If StrWordRate > MaxStrWordRate Then MaxStrWordRate = StrWordRate
		continue_i:
      Next i		    
		    		    
      CellRate = CellRate + MaxStrWordRate
	  continue_x:
    Next x               
        
    ' Mantemos a melhor combinação 
    If CellRate > MaxCellRate Then    
      MaxCellRate = CellRate
      BestCell    = Cell          
       
      FindCharNum = OccurrenceNum(Str, Cell)
      SimRate     = FindCharNum / Max(Len(Str),Len(Cell))
    End If       
        
  Next Cell
    
  IF SimRate >= SimThreshold Then 
    IF SimThreshold = -1 Then
      ReturnValue = BestCell + " (" + Format(SimRate, "0.00") + ")"
    ElseIf SimThreshold = -2 Then
      ReturnValue = Format(SimRate, "0.00")
    Else
      ReturnValue = BestCell
    End If
  Else 
    ReturnValue = ""
  End If    
  
  FuzzyLOOKUP = ReturnValue
End Function


Function OccurrenceNum(ByVal SourceString As String, ByVal TargetString As String)
  For i = 1 To Len(SourceString)	         		        	        
    ' Estamos procurando a ocorrência de cada símbolo 
    Position = InStr(1, TargetString, Mid(SourceString, i, 1), 1)  
    ' Aumentamos o contador de coincidências 
    If Position > 0 Then		  
      Count = Count + 1
      ' Remova o símbolo encontrado 
      TargetString = Left(TargetString, Position - 1) + Right(TargetString, Len(TargetString) - Position)   
    End If
  Next i    
  OccurrenceNum = Count
End Function


Function Max(ByVal value1 As Variant, ByVal value2 As Variant)  
  If value1 > value2 Then
	Result = value1
  Else
	Result = value2
  End If
  Max = Result
End Function

A seguir, feche Macro Editor e volte para a planilha LibreOffice Calc - agora você pode usar nosso novo recurso FuzzyLookup() .

Usando a extensão

Você também pode usar o recurso FUZZYLOOKUP() instalando a extensão gratuita YouLibreCalc.oxt ou sua versão completa YLC_Utilities.oxt .

Depois disso, esta função estará disponível em todos os arquivos que serão abertos em LibreOffice Calc.

Menu YLC Utilities no LO Calc

Menu YLC Utilities no LO Calc

Menu YLC Utilities no Excel

Menu YLC Utilities no Excel